home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 007 / exec1.arc / EXEC1.DSM next >
Text File  |  1985-08-30  |  20KB  |  403 lines

  1. ;    Author:        Jon Wesener
  2. ;    Date:        3 / 25 / 85
  3.  
  4. ;    Purpose:       This program listing is the EXEC function 4Bh
  5. ;            supplied by IBM's Command Shell.  It was taken out
  6. ;            of memory on a 256k PC.  This code is at the top
  7. ;            of memory and is called by the resident portion
  8. ;            of the Command Shell which passes the parameters in
  9. ;            memory instead of the registers.
  10.  
  11. ;               Included are 3 undocumented findings.  The first
  12. ;            is the storage of the stack registers in the calling
  13. ;            programs PSP.  Secondly, function 51 of DOS's INT 21
  14. ;            which sets up a PSP at the segment pointed to by DX.
  15. ;            And last, that AL = 01 to the EXEC function will load
  16. ;            a program and pass its stack and starting position
  17. ;            back to the caller in an extended Parameter Block.
  18.  
  19. ; DATA area begins at offset 54Eh
  20.  
  21. 3FA7:054E  1C 0B                                             ..
  22. 3FA7:0550  60 13 00 05 00 4B 15 00-00 00 01 3B 15 FE FF 3B   `....K.....;.~.;
  23. 3FA7:0560  15 36 15 C5 2A 3B 15 00-B4 30 CD 21 86 E0 3D 00   .6.E*;..40M!.`=.
  24. 3FA7:0570  02 73 09 BA 77 2B B4 09-CD 21 CD 20 B4 51 CD 21   .s.:w+4.M!M 4QM!
  25. 3FA7:0580  89 1E 5D 2B 4B 15 00 B4-3F 3B 15 09 00 00 00 00   ..]+K..4?;......
  26.  
  27. OFFSET    NAME        PURPOSE
  28. ------    ----        -------
  29. 054E    prm_off        temporary offset hold
  30. 0550    prm_seg        temporary segment hold
  31. 0552    exe_fnc        bit 2 - load overlay
  32. 0553    channel        dos program file handle
  33. 0555    relo_fctr    offset where load module will be loaded
  34. 0557    ld_siz        size of load module in paragraphs
  35. 0559    strt_off    start offset for new process
  36. 055B    strt_seg    start segment of new process
  37. 055D    nstk_sp        stack offset for new process
  38. 055F    new_Stk        stack segment for new process
  39. 0561    new_env        new copied environment
  40. 0563    new_siz        size of new program segment
  41. 0565    psp_seg        where program will be loaded
  42. 0567    hgh_low        this is the high\low loader switch !
  43. 0568    pgm_hdr        1e bytes for EXE header and 7 relocation elements
  44. 056C    pgm_siz        size of file in pages
  45. 056E    relo_itm    # of relocation items in the header
  46. 0570    hdr_siz        size of header in paragraphs
  47. 0572    min_par        minimum paragraphs needed above file
  48. 0574    max_par        maximum paragraphs above file needed
  49. 0576    stk_seg        the stack seg passed in by the linker
  50. 0578    stk_sp        the stack offs passed in by the linker
  51. 057C    str_ip        the start offset from the linker
  52. 0584    str_seg        where load module will be loaded
  53. 0586    ctl_cflg    control-c check before int called
  54. 0587    ovrwrt        overwrite address for environment
  55. 0589    cll_psp        calling programs PSP
  56. 058B    cur_dsk        current disk drive
  57.  
  58. ; CODE begins at offset 0h
  59.  
  60. 3FA7:0000 0E            PUSH    CS
  61. 3FA7:0001 1F            POP     DS        ; pt to internal data
  62. 3FA7:0002 B80033        MOV     AX,3300
  63. 3FA7:0005 CD21          INT     21        ; check CTRL - C status
  64. 3FA7:0007 88168605      MOV     [Ctl_CFLG],DL    ; save it
  65. 3FA7:000B 33D2          XOR     DX,DX
  66. 3FA7:000D B80133        MOV     AX,3301
  67. 3FA7:0010 CD21          INT     21        ; turn off CRTL-C check
  68. 3FA7:0012 B451          MOV     AH,51
  69. 3FA7:0014 CD21          INT     21
  70. 3FA7:0016 891E8905      MOV     [cll_psp],BX    ; get calling procs PSP
  71. 3FA7:001A 1E            PUSH    DS        ; later changed to new
  72. 3FA7:001B 8EDB          MOV     DS,BX        ; procs PSP
  73. 3FA7:001D 36            SS:
  74. 3FA7:001E C41EB30B      LES     BX,[0BB3]    ; save calling programs
  75. 3FA7:0022 8C063000      MOV     [0030],ES    ; stack inside his PSP at
  76. 3FA7:0026 891E2E00      MOV     [002E],BX    ; PSP + 30h & 2Eh
  77. 3FA7:002A 1F            POP     DS        ; this is undocumented
  78. 3FA7:002B B419          MOV     AH,19
  79. 3FA7:002D CD21          INT     21        ; get current disk
  80. 3FA7:002F 8AD0          MOV     DL,AL
  81. 3FA7:0031 B40E          MOV     AH,0E
  82. 3FA7:0033 CD21          INT     21        ; reset current disk
  83. 3FA7:0035 A28B05        MOV     [cur_dsk],AL    ; save what it is
  84. 3FA7:0038 B104          MOV     CL,04
  85. 3FA7:003A B8D200        MOV     AX,00D2
  86. 3FA7:003D D3E8          SHR     AX,CL
  87. 3FA7:003F 0E            PUSH    CS        ; this mess pts to the code
  88. 3FA7:0040 5B            POP     BX        ; further ahead to check if
  89. 3FA7:0041 03C3          ADD     AX,BX        ; the environment was copied
  90. 3FA7:0043 A38705        MOV     [ovrwrt],AX    ; on top of this code !
  91. 3FA7:0046 E8EF04        CALL    0538
  92. 3FA7:0049 8B04          MOV     AX,[SI]        ; restore exec function
  93. 3FA7:004B 8B5C02        MOV     BX,[SI+02]    ; restore parm block offs
  94. 3FA7:004E 8B5406        MOV     DX,[SI+06]    ; restore name offs
  95. 3FA7:0051 8E4410        MOV     ES,[SI+10]    ; restore parm seg
  96. 3FA7:0054 8E5C0E        MOV     DS,[SI+0E]    ; restore name seg
  97. 3FA7:0057 3C03          CMP     AL,03        ; load overlay or prog
  98. 3FA7:0059 7607          JBE     0062        ; yep
  99. 3FA7:005B B001          MOV     AL,01        ; signal invalid function
  100. 3FA7:005D E9B804        JMP     0518        ; and report error <--+
  101. 3FA7:0060 EBFB          JMP     005D        ; pts to above -------+
  102. 3FA7:0062 3C02          CMP     AL,02        ; test for invalid function
  103. 3FA7:0064 74F5          JZ      005B        ; signal invalid function
  104. 3FA7:0066 2E            CS:
  105. 3FA7:0067 891E4E05      MOV     [prm_off],BX    ; save parm block offs
  106. 3FA7:006B 2E            CS:
  107. 3FA7:006C 8C065005      MOV     [prm_seg],ES    ; save parm block seg
  108. 3FA7:0070 2E            CS:
  109. 3FA7:0071 A25205        MOV     [exe_fnc],AL    ; save the function
  110. 3FA7:0074 2E            CS:
  111. 3FA7:0075 C606670500    MOV     BYTE PTR [0567],00
  112. 3FA7:007A B8003D        MOV     AX,3D00
  113. 3FA7:007D CD21          INT     21        ; open the file
  114. 3FA7:007F 72DF          JB      0060        ; error if not found
  115. 3FA7:0081 2E            CS:
  116. 3FA7:0082 A35305        MOV     [channel],AX    ; save the file handle
  117. 3FA7:0085 8BD8          MOV     BX,AX
  118. 3FA7:0087 B80044        MOV     AX,4400
  119. 3FA7:008A CD21          INT     21        ; get device status
  120. 3FA7:008C F6C280        TEST    DL,80        ; test for eof
  121. 3FA7:008F 7404          JZ      0095        ; load whatever
  122. 3FA7:0091 B002          MOV     AL,02        ; signal file not found
  123. 3FA7:0093 EBCB          JMP     0060
  124. 3FA7:0095 2E            CS:            ; zero new psp seg
  125. 3FA7:0096 C70665050000  MOV     WORD PTR [psp_seg],0000
  126. 3FA7:009C 2E            CS:
  127. 3FA7:009D F606520502    TEST    BYTE PTR [exe_fnc],02
  128. 3FA7:00A2 7560          JNZ     0104        ; go load overlay
  129. 3FA7:00A4 2E            CS:
  130. 3FA7:00A5 C5364E05      LDS     SI,[prm_off]
  131. 3FA7:00A9 8B04          MOV     AX,[SI]        ; get environment seg
  132. 3FA7:00AB 0BC0          OR      AX,AX        ; from parm block
  133. 3FA7:00AD 7510          JNZ     00BF        ; we have supplied environment
  134. 3FA7:00AF 2E            CS:
  135. 3FA7:00B0 8E1E8905      MOV     DS,[cll_psp]    ; get Calling procs PSP
  136. 3FA7:00B4 A12C00        MOV     AX,[002C]    ; read it from its PSP
  137. 3FA7:00B7 2E            CS:
  138. 3FA7:00B8 A36105        MOV     [new_env],AX    ; store ENV seg to be copied
  139. 3FA7:00BB 0BC0          OR      AX,AX
  140. 3FA7:00BD 7445          JZ      0104        ; doesn't have an environment
  141. 3FA7:00BF FC            CLD
  142. 3FA7:00C0 8EC0          MOV     ES,AX
  143. 3FA7:00C2 33FF          XOR     DI,DI
  144. 3FA7:00C4 B9FF7F        MOV     CX,7FFF        ; MAX SIZE of a valid env
  145. 3FA7:00C7 32C0          XOR     AL,AL        ; look for zeros
  146. 3FA7:00C9 F2            REPNZ                                      
  147. 3FA7:00CA AE            SCASB                                      
  148. 3FA7:00CB 7405          JZ      00D2        ; found end of a string
  149. 3FA7:00CD B00A          MOV     AL,0A
  150. 3FA7:00CF E99E00        JMP     0170        ; signal invalid env
  151. 3FA7:00D2 AE            SCASB            ; check for double zero
  152. 3FA7:00D3 75F4          JNZ     00C9        ; not there yet
  153. 3FA7:00D5 57            PUSH    DI        ; save size of env
  154. 3FA7:00D6 8BDF          MOV     BX,DI
  155. 3FA7:00D8 83C30F        ADD     BX,+0F        ; round up
  156. 3FA7:00DB B104          MOV     CL,04
  157. 3FA7:00DD D3EB          SHR     BX,CL        ; convert to segments
  158. 3FA7:00DF 06            PUSH    ES
  159. 3FA7:00E0 B448          MOV     AH,48
  160. 3FA7:00E2 CD21          INT     21        ; allocate mem for new env
  161. 3FA7:00E4 1F            POP     DS        ; pt to old env
  162. 3FA7:00E5 59            POP     CX        ; get size
  163. 3FA7:00E6 7303          JNB     00EB        ; no probs allocating mem
  164. 3FA7:00E8 E97F00        JMP     016A        ; not enough mem err
  165. 3FA7:00EB 8EC0          MOV     ES,AX        ; pt to new env with es
  166. 3FA7:00ED 2E            CS:
  167. 3FA7:00EE A36105        MOV     [new_env],AX    ; save ptr to new env
  168. 3FA7:00F1 51            PUSH    CX        ; save size of env
  169. 3FA7:00F2 8CC1          MOV     CX,ES
  170. 3FA7:00F4 03CB          ADD     CX,BX        ; see if we step on our tail
  171. 3FA7:00F6 2E            CS:
  172. 3FA7:00F7 3B1E8705      CMP     BX,[ovrwrt]    ; will we write over ourself?
  173. 3FA7:00FB 59            POP     CX        ; get size back
  174. 3FA7:00FC 776C          JA      016A
  175. 3FA7:00FE 33F6          XOR     SI,SI
  176. 3FA7:0100 33FF          XOR     DI,DI
  177. 3FA7:0102 F3            REPZ
  178. 3FA7:0103 A4            MOVSB            ; copy old env to new
  179. 3FA7:0104 0E            PUSH    CS
  180. 3FA7:0105 1F            POP     DS
  181. 3FA7:0106 B91E00        MOV     CX,001E        ; read first 1eh bytes
  182. 3FA7:0109 8B1E5305      MOV     BX,[channel]    ; of program into data area                      
  183. 3FA7:010D BA6805        MOV     DX,pgm_hdr
  184. 3FA7:0110 06            PUSH    ES
  185. 3FA7:0111 1E            PUSH    DS
  186. 3FA7:0112 E8CC03        CALL    04E1
  187. 3FA7:0115 B43F          MOV     AH,3F
  188. 3FA7:0117 CD21          INT     21        ; read it in
  189. 3FA7:0119 E8CE03        CALL    04EA
  190. 3FA7:011C 1F            POP     DS
  191. 3FA7:011D 07            POP     ES
  192. 3FA7:011E 724E          JB      016E        ; bad format error
  193. 3FA7:0120 3D1E00        CMP     AX,001E
  194. 3FA7:0123 7519          JNZ     013E        ; .COM file (?)
  195. 3FA7:0125 833E740500    CMP     WORD PTR [max_par],+00
  196. 3FA7:012A 7505          JNZ     0131        ; MAX Paragraphs needed above
  197. 3FA7:012C C6066705FF    MOV     BYTE PTR [hgh_low],FF ; set high / low switch
  198. 3FA7:0131 A16805        MOV     AX,[pgm_hdr]
  199. 3FA7:0134 3D4D5A        CMP     AX,5A4D        ; check if EXE format
  200. 3FA7:0137 7408          JZ      0141
  201. 3FA7:0139 3D5A4D        CMP     AX,4D5A
  202. 3FA7:013C 7403          JZ      0141        ; load EXE program
  203. 3FA7:013E E9C201        JMP     0303        ; its a .COM prog
  204. 3FA7:0141 A16C05        MOV     AX,[pgm_siz]    ; get size in pages
  205. 3FA7:0144 B105          MOV     CL,05
  206. 3FA7:0146 D3E0          SHL     AX,CL        ; convert to paragraphs
  207. 3FA7:0148 2B067005      SUB     AX,[hdr_siz]    ; subtract header size
  208. 3FA7:014C A35705        MOV     [ld_siz],AX    ; save load module size
  209. 3FA7:014F F606520502    TEST    BYTE PTR [exe_fnc],02
  210. 3FA7:0154 742B          JZ      0181        ; go load program
  211. 3FA7:0156 C43E4E05      LES     DI,[prm_off]
  212. 3FA7:015A 26            ES:
  213. 3FA7:015B 8B05          MOV     AX,[DI]        ; get segment to load
  214. 3FA7:015D A38405        MOV     [str_seg],AX    ; overlay and store it
  215. 3FA7:0160 26            ES:
  216. 3FA7:0161 8B4502        MOV     AX,[DI+02]
  217. 3FA7:0164 A35505        MOV     [relo_fctr],AX    ; same for overlay offset
  218. 3FA7:0167 E9BA00        JMP     0224
  219. 3FA7:016A B008          MOV     AL,08
  220. 3FA7:016C EB02          JMP     0170        ; not enough mem error
  221. 3FA7:016E B00B          MOV     AL,0B
  222. 3FA7:0170 50            PUSH    AX
  223. 3FA7:0171 2E            CS:
  224. 3FA7:0172 8B1E5305      MOV     BX,[channel]
  225. 3FA7:0176 E86803        CALL    04E1
  226. 3FA7:0179 B43E          MOV     AH,3E
  227. 3FA7:017B CD21          INT     21        ; close the file (?)
  228. 3FA7:017D 58            POP     AX
  229. 3FA7:017E E99703        JMP     0518        ; exit (?) error handler
  230. 3FA7:0181 50            PUSH    AX
  231. 3FA7:0182 BBFFFF        MOV     BX,FFFF
  232. 3FA7:0185 1E            PUSH    DS
  233. 3FA7:0186 B448          MOV     AH,48
  234. 3FA7:0188 CD21          INT     21        ; find available mem
  235. 3FA7:018A 1F            POP     DS
  236. 3FA7:018B 58            POP     AX
  237. 3FA7:018C 051000        ADD     AX,0010        ; add psp size to load module
  238. 3FA7:018F 83FB11        CMP     BX,+11
  239. 3FA7:0192 72D6          JB      016A        ; not enough mem for PSP + 1
  240. 3FA7:0194 3BC3          CMP     AX,BX        ; do we have enough mem
  241. 3FA7:0196 77D2          JA      016A        ; not enough mem
  242. 3FA7:0198 803E670500    CMP     BYTE PTR [hgh_low],00
  243. 3FA7:019D 7518          JNZ     01B7        ; no high\low problems
  244. 3FA7:019F 03067205      ADD     AX,[min_par]    ; add min mem needed
  245. 3FA7:01A3 72C5          JB      016A        ; not enough mem
  246. 3FA7:01A5 3BC3          CMP     AX,BX
  247. 3FA7:01A7 77C1          JA      016A        ; don't have minimum needed
  248. 3FA7:01A9 2B067205      SUB     AX,[min_par]
  249. 3FA7:01AD 03067405      ADD     AX,[max_par]
  250. 3FA7:01B1 7204          JB      01B7        ; overflow - not enough mem
  251. 3FA7:01B3 3BC3          CMP     AX,BX
  252. 3FA7:01B5 7602          JBE     01B9        ; allocate max needed
  253. 3FA7:01B7 8BC3          MOV     AX,BX        ; or all that we can < MAX
  254. 3FA7:01B9 1E            PUSH    DS
  255. 3FA7:01BA 8BD8          MOV     BX,AX
  256. 3FA7:01BC 891E6305      MOV     [new_siz],BX    ; save amount requested
  257. 3FA7:01C0 B448          MOV     AH,48
  258. 3FA7:01C2 CD21          INT     21        ; allocate it
  259. 3FA7:01C4 1F            POP     DS
  260. 3FA7:01C5 72A3          JB      016A        ; not enough mem
  261. 3FA7:01C7 A36505        MOV     [psp_seg],AX    ; save new seg
  262. 3FA7:01CA 051000        ADD     AX,0010        ; pt to org 100
  263. 3FA7:01CD 803E670500    CMP     BYTE PTR [hgh_low],00
  264. 3FA7:01D2 740B          JZ      01DF        ; test it again
  265. 3FA7:01D4 03066305      ADD     AX,[new_siz]    ; figure where it goes
  266. 3FA7:01D8 2B065705      SUB     AX,[ld_siz]    ; if we load it high
  267. 3FA7:01DC 2D1000        SUB     AX,0010
  268. 3FA7:01DF A35505        MOV     [relo_fctr],AX    ; save the pointer
  269. 3FA7:01E2 A38405        MOV     [str_seg],AX    ; twice (?)
  270. 3FA7:01E5 3B068705      CMP     AX,[ovrwrt]
  271. 3FA7:01E9 772A          JA      0215        ; we're writing over ourself
  272. 3FA7:01EB 03065705      ADD     AX,[ld_siz]
  273. 3FA7:01EF 3B068705      CMP     AX,[ovrwrt]
  274. 3FA7:01F3 762F          JBE     0224        ; we aren't writing over us
  275. 3FA7:01F5 803E670500    CMP     BYTE PTR [hgh_low],00
  276. 3FA7:01FA 7425          JZ      0221        ; avoid loading it lower
  277. 3FA7:01FC 8BD0          MOV     DX,AX        ; compute the old starting
  278. 3FA7:01FE 2B166305      SUB     DX,[new_siz]    ; address, try and load it
  279. 3FA7:0202 03165705      ADD     DX,[ld_siz]    ; lower in mem
  280. 3FA7:0206 3B168705      CMP     DX,[ovrwrt]
  281. 3FA7:020A 7715          JA      0221        ; can't load any lower
  282. 3FA7:020C A18705        MOV     AX,[ovrwrt]    ; load it as high as we
  283. 3FA7:020F 2B065705      SUB     AX,[ld_siz]    ; can without overwriting us
  284. 3FA7:0213 EBCA          JMP     01DF        ; test it again
  285. 3FA7:0215 8CCA          MOV     DX,CS
  286. 3FA7:0217 81C25900      ADD     DX,0059        ; test if were over ourself
  287. 3FA7:021B 3BC2          CMP     AX,DX        ; again
  288. 3FA7:021D 73D6          JNB     01F5        ; lower it if highlow
  289. 3FA7:021F EBDB          JMP     01FC        ; else lower it automatically
  290. 3FA7:0221 E946FF        JMP     016A        ; not enough mem err
  291. 3FA7:0224 8B167005      MOV     DX,[hdr_siz]    ; get the header size
  292. 3FA7:0228 52            PUSH    DX
  293. 3FA7:0229 B104          MOV     CL,04
  294. 3FA7:022B D3E2          SHL     DX,CL        ; convert it to bytes
  295. 3FA7:022D 58            POP     AX
  296. 3FA7:022E B10C          MOV     CL,0C
  297. 3FA7:0230 D3E8          SHR     AX,CL
  298. 3FA7:0232 8BC8          MOV     CX,AX        ; and store in cx:dx
  299. 3FA7:0234 8B1E5305      MOV     BX,[channel]
  300. 3FA7:0238 1E            PUSH    DS
  301. 3FA7:0239 B80042        MOV     AX,4200
  302. 3FA7:023C CD21          INT     21        ; move mfp to load module
  303. 3FA7:023E 1F            POP     DS
  304. 3FA7:023F 8B1E5705      MOV     BX,[ld_siz]
  305. 3FA7:0243 81FB0010      CMP     BX,1000        ; is file bigger than 64k
  306. 3FA7:0247 7203          JB      024C
  307. 3FA7:0249 BBE00F        MOV     BX,0FE0
  308. 3FA7:024C 291E5705      SUB     [ld_siz],BX    ; read in at most FE00 bytes
  309. 3FA7:0250 53            PUSH    BX        ; save count
  310. 3FA7:0251 B104          MOV     CL,04
  311. 3FA7:0253 D3E3          SHL     BX,CL        ; convert para-s to bytes
  312. 3FA7:0255 8BCB          MOV     CX,BX
  313. 3FA7:0257 8B1E5305      MOV     BX,[channel]
  314. 3FA7:025B 1E            PUSH    DS
  315. 3FA7:025C 8E1E8405      MOV     DS,[str_seg]    ; point to start segment
  316. 3FA7:0260 33D2          XOR     DX,DX
  317. 3FA7:0262 51            PUSH    CX        ; save the count
  318. 3FA7:0263 E87B02        CALL    04E1
  319. 3FA7:0266 B43F          MOV     AH,3F
  320. 3FA7:0268 CD21          INT     21        ; read in the load module
  321. 3FA7:026A E87D02        CALL    04EA
  322. 3FA7:026D 59            POP     CX
  323. 3FA7:026E 1F            POP     DS
  324. 3FA7:026F 3BC8          CMP     CX,AX        ; did we hit eof
  325. 3FA7:0271 5B            POP     BX
  326. 3FA7:0272 750B          JNZ     027F
  327. 3FA7:0274 011E8405      ADD     [str_seg],BX    ; compute next load address
  328. 3FA7:0278 833E570500    CMP     WORD PTR [ld_siz],+00
  329. 3FA7:027D 75C0          JNZ     023F        ; we haven't reached eof
  330. 3FA7:027F 8B0E5505      MOV     CX,[relo_fctr]    ; start offset (!) not an offset
  331. 3FA7:0283 A17605        MOV     AX,[stk_seg]    ; read in stk_seg
  332. 3FA7:0286 03C1          ADD     AX,CX        ; compute new stack segment
  333. 3FA7:0288 A35F05        MOV     [new_stk],AX    ; save it for later
  334. 3FA7:028B A17805        MOV     AX,[stk_sp]    ; get new SP value
  335. 3FA7:028E A35D05        MOV     [nstk_sp],AX    ; save it for later
  336. 3FA7:0291 C4067C05      LES     AX,[str_ip]    ; initial start offset
  337. 3FA7:0295 A35905        MOV     [strt_off],AX    ; save it
  338. 3FA7:0298 8CC0          MOV     AX,ES        ;   psp segment
  339. 3FA7:029A 03C1          ADD     AX,CX        ; + relocation factor
  340. 3FA7:029C A35B05        MOV     [strt_seg],AX    ; = start segment, save it!
  341. 3FA7:029F 33C9          XOR     CX,CX
  342. 3FA7:02A1 8B168005      MOV     DX,[0580]    ; get ptr to relocation tble
  343. 3FA7:02A5 8B1E5305      MOV     BX,[channel]
  344. 3FA7:02A9 1E            PUSH    DS
  345. 3FA7:02AA B80042        MOV     AX,4200        ; move file ptr to table
  346. 3FA7:02AD CD21          INT     21
  347. 3FA7:02AF 1F            POP     DS
  348. 3FA7:02B0 7303          JNB     02B5
  349. 3FA7:02B2 E9B9FE        JMP     016E        ; bad format error
  350. 3FA7:02B5 8B166E05      MOV     DX,[relo_itm]    ; # of relocation items
  351. 3FA7:02B9 52            PUSH    DX        ; the pgm_hdr is done, use the
  352. 3FA7:02BA BA6805        MOV     DX,pgm_hdr    ; area for 7 relocation items
  353. 3FA7:02BD B91C00        MOV     CX,001C        ; 7 * 4 = 1C
  354. 3FA7:02C0 2E            CS:
  355. 3FA7:02C1 8B1E5305      MOV     BX,[channel]
  356. 3FA7:02C5 1E            PUSH    DS
  357. 3FA7:02C6 E81802        CALL    04E1
  358. 3FA7:02C9 B43F          MOV     AH,3F
  359. 3FA7:02CB CD21          INT     21        ; read it in
  360. 3FA7:02CD E81A02        CALL    04EA
  361. 3FA7:02D0 07            POP     ES
  362. 3FA7:02D1 5A            POP     DX        ; # of items to adjust
  363. 3FA7:02D2 72DE          JB      02B2        ; bad format error
  364. 3FA7:02D4 B90700        MOV     CX,0007        ; 7 items in buffer
  365. 3FA7:02D7 BF6805        MOV     DI,pgm_hdr    ; pt to the first
  366. 3FA7:02DA 2E            CS:
  367. 3FA7:02DB 8B365505      MOV     SI,[relo_fctr]
  368. 3FA7:02DF 83FA00        CMP     DX,+00        ; are we done ?
  369. 3FA7:02E2 7503          JNZ     02E7        ; nope
  370. 3FA7:02E4 E9CD00        JMP     03B4        ; yep
  371. 3FA7:02E7 26            ES:
  372. 3FA7:02E8 C51D          LDS     BX,[DI]        ; get pointer to one
  373. 3FA7:02EA 8CD8          MOV     AX,DS        ; add the relocation
  374. 3FA7:02EC 03C6          ADD     AX,SI        ; factor for item to be
  375. 3FA7:02EE 8ED8          MOV     DS,AX        ; updated in memory
  376. 3FA7:02F0 8B07          MOV     AX,[BX]        ; get it
  377. 3FA7:02F2 03C6          ADD     AX,SI        ; adjust it
  378. 3FA7:02F4 8907          MOV     [BX],AX        ; put it back
  379. 3FA7:02F6 83C704        ADD     DI,+04        ; pt to next item
  380. 3FA7:02F9 4A            DEC     DX        ; one less to go
  381. 3FA7:02FA E2E3          LOOP    02DF        ; used up 7 items yet ?
  382. 3FA7:02FC 06            PUSH    ES
  383. 3FA7:02FD 1F            POP     DS                                 
  384. 3FA7:02FE EBB9          JMP     02B9        ; read some more in                               
  385. 3FA7:0300 E967FE        JMP     016A
  386. 3FA7:0303 2E            CS:
  387. 3FA7:0304 F606520502    TEST    BYTE PTR [exe_fnc],02
  388. 3FA7:0309 740C          JZ      0317        ; loading a program
  389. 3FA7:030B 2E            CS:
  390. 3FA7:030C C5364E05      LDS     SI,[prm_off]    ; pt to parm block
  391. 3FA7:0310 AD            LODSW            ; read in the address
  392. 3FA7:0311 2E            CS:            ; for overlay
  393. 3FA7:0312 A38405        MOV     [str_seg],AX    ; store it
  394. 3FA7:0315 EB41          JMP     0358        ; go read it in
  395. 3FA7:0317 BBFFFF        MOV     BX,FFFF
  396. 3FA7:031A B448          MOV     AH,48
  397. 3FA7:031C CD21          INT     21        ; how much mem available
  398. 3FA7:031E 0BDB          OR      BX,BX        ; none ?
  399. 3FA7:0320 74DE          JZ      0300        ; not enough mem error
  400. 3FA7:0322 2E            CS:
  401. 3FA7:0323 891E6305      MOV     [new_siz],BX    ; store how much we got
  402. 3FA7:0327 B448          MOV     AH,48
  403. 3FA7:0329 CD21          INT     21        ; and al